#pragma once

#include "composite_configuration_provider.h"
#include "json_file_provider.h"
#include "environment_variable_provider.h"
#include "basic_configuration_validator.h"
#include <QString>
#include <QStringList>
#include <memory>

namespace infrastructure {

/**
 * @class ConfigurationBuilder
 * @brief 配置系统构建器，提供流畅的API来创建和配置整个配置系统
 */
class ConfigurationBuilder {
public:
    ConfigurationBuilder();
    ~ConfigurationBuilder() = default;

    // 添加配置源
    ConfigurationBuilder& addJsonFile(const QString& filePath, int priority = 100, bool optional = false);
    ConfigurationBuilder& addEnvironmentVariables(int priority = 200);
    ConfigurationBuilder& addEnvironmentVariables(const QString& prefix, int priority = 200);
    ConfigurationBuilder& addEnvironmentVariables(const QStringList& allowedKeys, int priority = 200);
    
    // 添加自定义提供者
    ConfigurationBuilder& addProvider(std::shared_ptr<IConfigurationProvider> provider);
    
    // 添加验证器
    ConfigurationBuilder& addValidator(std::shared_ptr<IConfigurationValidator> validator);
    ConfigurationBuilder& addBasicValidation();
    
    // 配置验证规则
    ConfigurationBuilder& requireKey(const QString& key, const QString& message = "");
    ConfigurationBuilder& validateType(const QString& key, QVariant::Type expectedType, const QString& message = "");
    ConfigurationBuilder& validateRange(const QString& key, const QVariant& min, const QVariant& max, const QString& message = "");
    ConfigurationBuilder& validateLength(const QString& key, int minLength, int maxLength, const QString& message = "");
    ConfigurationBuilder& validatePattern(const QString& key, const QString& pattern, const QString& message = "");
    ConfigurationBuilder& validateCustom(const QString& key, std::function<bool(const QVariant&)> validator, const QString& message = "");
    
    // 构建配置系统
    std::shared_ptr<CompositeConfigurationProvider> build();
    
    // 预定义配置模板
    static ConfigurationBuilder createDefault(const QString& appConfigPath = "");
    static ConfigurationBuilder createFromJsonFile(const QString& filePath);
    static ConfigurationBuilder createWithEnvironmentOnly(const QString& prefix = "");

private:
    std::shared_ptr<CompositeConfigurationProvider> m_provider;
    std::shared_ptr<BasicConfigurationValidator> m_basicValidator;
    bool m_basicValidatorAdded;
    
    void ensureBasicValidator();
};

/**
 * @brief 配置系统快速设置的便捷函数
 */
namespace ConfigurationFactory {
    
    /**
     * @brief 创建默认配置系统
     * @param appConfigPath 应用配置文件路径（可选）
     * @return 配置系统实例
     */
    std::shared_ptr<kernel::IConfiguration> createDefault(const QString& appConfigPath = "config.json");
    
    /**
     * @brief 从JSON文件创建配置系统
     * @param filePath JSON配置文件路径
     * @return 配置系统实例
     */
    std::shared_ptr<kernel::IConfiguration> fromJsonFile(const QString& filePath);
    
    /**
     * @brief 仅从环境变量创建配置系统
     * @param prefix 环境变量前缀
     * @return 配置系统实例
     */
    std::shared_ptr<kernel::IConfiguration> fromEnvironmentVariables(const QString& prefix = "APP");
    
    /**
     * @brief 创建用于测试的配置系统
     * @param testData 测试数据
     * @return 配置系统实例
     */
    std::shared_ptr<kernel::IConfiguration> createForTesting(const QHash<QString, QVariant>& testData = {});
}

} // namespace infrastructure 